#pragma once
#include <vector>

#include "point.h"
#include "string_math.hpp"

struct struct_u32_xyz {
    uint32_t x, y, z;
};

struct PreprocessInfo {
    struct_u32_xyz shift;
    struct_u32_xyz scale;
};


struct PreprocessedPointsInfo {
    std::vector<BaseGeo::Point> points;
    PreprocessInfo preprocess_info;
};

const struct_u32_xyz ineffective_shift = {0, 0, 0};

const struct_u32_xyz ineffective_scale = {1, 1, 1};

PreprocessInfo GrabPreprocessInfo(const std::vector<String3DPoint>& str_points);

PreprocessedPointsInfo PreprocessPoints(std::vector<String3DPoint> str_points, const PreprocessInfo& preprocess_info);

BaseGeo::Point PreprocessPoint(String3DPoint str_point, const PreprocessInfo& preprocess_info);

String3DPoint InversePreprocessedPoint(BaseGeo::Point point, const PreprocessInfo& preprocess_info);
